home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / asm / music / replayers / prorunner2.0a_vbl.s < prev    next >
Encoding:
Text File  |  1980-01-04  |  40.7 KB  |  1,941 lines

  1. ***************
  2. * TESTPROGRAM *
  3. ***************
  4.  
  5. start:
  6.     lea    $dff000,a5
  7.     move.w    $1c(a5),d0
  8.     bset    #15,d0
  9.     move.w    d0,oldint
  10.  
  11.     move.w    #$83ff,$96(a5)
  12.     
  13.     move.l    #pr_data,pr_module
  14.     bsr.w    pr_init
  15.  
  16. main:    cmp.b    #160,$dff006
  17.     bne.s    main
  18.  
  19.     move.w    #$00f,$dff180
  20.     bsr.w    pr_music
  21.     move.w    #$4,$dff180
  22.  
  23.     btst    #6,$bfe001
  24.     bne.s    main
  25.  
  26.     bsr    pr_fade_music
  27.     
  28.     lea    $dff000,a5
  29.     move.w    oldint(pc),$9a(a5)
  30.     move.w    #$83f0,$96(a5)
  31.     
  32.     moveq.l    #0,d0
  33.     move.l    d0,d1
  34.     move.w    maxraster,d0
  35.     move.w    medraster,d1
  36.  
  37. gpc    rts
  38.  
  39. maxraster:    dc.w    0
  40. medraster:    dc.w    0
  41. oldint:        dc.w    0
  42.  
  43. pr_fade_music
  44.     move.w    #-1,pr_musicfadedirection    ; Now fading out...
  45. main4:    cmp.b    #160,$dff006
  46.     bne.s    main4
  47.     bsr.w    pr_music
  48.     tst.w    pr_musicfadect
  49.     bne.s    main4
  50.     bsr    pr_end
  51.     rts
  52.     
  53. *****************************************
  54. *                    *
  55. * PRORUNNER V2.0            *
  56. * --------------            *
  57. * CODED BY COSMOS OF SANITY IN 1992    *
  58. *                    *
  59. *****************************************
  60. *                    *
  61. * Supporting the following effects:    *
  62. *                    *
  63. *    - Running with 68010/20/30/40    *
  64. *    - Using VBR-register        *
  65. *    - Packed/Normal PT-Moduleformat    *
  66. *    - Fade Sound in/out        *
  67. *    - Variable Musicfadespeed    *
  68. *    - Variable Interrupt-timing    *
  69. *    - Finetune            *
  70. *    - Normal play or Arpeggio    *
  71. *    - Slide Frequenz up        *
  72. *    - Slide    Frequenz down        *
  73. *    - Tone Portamento        *
  74. *    - Vibrato            *
  75. *    - Tone Portamento+Volume Slide    *
  76. *    - Vibrato + Volume Slide    *
  77. *    - Tremolo            *
  78. *    - Set SampleOffset        *
  79. *    - Volume Slide            *
  80. *    - Position Jump            *
  81. *    - Set Volume            *
  82. *    - Pattern Break            *
  83. *    - Set Speed            *
  84. * - E-Commands:                *
  85. *    - Set Filter            *
  86. *    - Fine Slide Up            *
  87. *    - Fine Slide Down        *
  88. *    - Glissando Control        *
  89. *    - Set Vibrato Waveform        *
  90. *    - Set Finetune            *
  91. *    - Set Loop / Jump to Loop    *
  92. *    - Set Tremolo Waveform        *
  93. *    - Retrig Note            *
  94. *    - Fine VolumeSlide Up        *
  95. *    - Fine VolumeSlide Down        *
  96. *    - NoteCut            *
  97. *    - NoteDelay            *
  98. *    - PatternDelay            *
  99. *    - FunkRepeat            *
  100. *                    *
  101. *****************************************
  102.  
  103. YES                EQU    1
  104. NO                EQU    0
  105. INCLUDEFADINGROUTINE        EQU    YES
  106. PACKEDSONGFORMAT        EQU    NO
  107. FADINGSTEPS            EQU    6    ; ( 0< FADINGSTEPS <9 )
  108. MAXVOLUME            EQU    2^FADINGSTEPS
  109. INTERRUPTTIME            EQU    $180
  110.  
  111. SAMPLELENGTHOFFSET        EQU    4
  112. SAMPLEVOLUMEOFFSET        EQU    6
  113. SAMPLEREPEATPOINTOFFSET        EQU    8
  114. SAMPLEWITHLOOP            EQU    12
  115. SAMPLEREPEATLENGTHOFFSET    EQU    14
  116. SAMPLEFINETUNEOFFSET        EQU    16
  117.  
  118. * Init-Routine *******************************************************
  119.  
  120. pr_init:
  121.     lea    pr_framecounter(pc),a6
  122.     move.w    #$7fff,pr_oldledvalue-pr_framecounter(a6)
  123.     move.l    pr_module(pc),a0
  124.     cmp.l    #0,a0
  125.     bne.s    pr_init1
  126.     rts
  127. pr_init1:
  128.     IFEQ    PACKEDSONGFORMAT-YES
  129.     cmp.l    #'SNT!',(a0)
  130.     beq.s    pr_init2
  131.     ELSE
  132.     cmp.l    #'M.K.',1080(a0)
  133.     beq.s    pr_init2
  134.     cmp.l    #'SNT.',1080(a0)
  135.     beq.s    pr_init2
  136.     ENDC
  137.     rts
  138. pr_init2:
  139.     IFEQ    PACKEDSONGFORMAT-YES
  140.     lea    8(a0),a1
  141.     ELSE
  142.     lea    20(a0),a1
  143.     ENDC
  144.     lea    pr_Sampleinfos(pc),a2
  145.     moveq.l    #32,d7
  146.     moveq    #30,d0
  147. pr_init3:
  148.     IFNE    PACKEDSONGFORMAT-YES
  149.     lea    22(a1),a1        ; Samplenamen überspringen
  150.     ENDC
  151.     move.w    (a1)+,SAMPLELENGTHOFFSET(a2)    ; Samplelength in Words
  152.     lea    pr_periods(pc),a3
  153.     moveq    #$f,d2
  154.     and.b    (a1)+,d2        ; Finetuning
  155.     mulu.w    #36*2,d2
  156.     add.l    d2,a3
  157.     move.l    a3,SAMPLEFINETUNEOFFSET(a2)
  158.     moveq    #0,d1
  159.     move.b    (a1)+,d1
  160.     move.w    d1,SAMPLEVOLUMEOFFSET(a2)    ; Volume
  161.     moveq.l    #0,d1
  162.     move.w    (a1)+,d1        ; Repeatpoint in Bytes
  163.     add.l    d1,d1
  164.     move.l    d1,SAMPLEREPEATPOINTOFFSET(a2)
  165.     move.w    (a1)+,d1
  166.     clr.w    SAMPLEWITHLOOP(a2)
  167.     cmp.w    #1,d1
  168.     bls.s    pr_init3_2
  169.     addq.w    #1,SAMPLEWITHLOOP(a2)
  170. pr_init3_2:
  171.     move.w    d1,SAMPLEREPEATLENGTHOFFSET(a2)    ; Repeatlength
  172.     add.l    d7,a2
  173.     dbf    d0,pr_init3
  174.  
  175.     moveq    #0,d0
  176.     IFEQ    PACKEDSONGFORMAT-YES
  177.     move.b    256(a0),d0
  178.     ELSE
  179.     move.b    950(a0),d0        ; Number of patterns
  180.     ENDC
  181.     subq.w    #1,d0
  182.     move.w    d0,pr_highestpattern-pr_framecounter(a6)
  183.     moveq.l    #0,d1
  184.     lea    pr_Patternpositions(pc),a3
  185.     IFEQ    PACKEDSONGFORMAT-YES
  186.     lea    258(a0),a1        ; 1.Patternpos
  187.     lea    770(a0),a2        ; 1.Patterndata
  188.     lea    642(a0),a4        ; 1.Patternoffset
  189. pr_init4:
  190.     moveq.l    #0,d2
  191.     move.b    (a1)+,d2
  192.     add.w    d2,d2
  193.     move.w    (a4,d2.w),d2
  194.     add.l    a2,d2
  195.     move.l    d2,(a3)+
  196.     dbf    d0,pr_init4
  197.     ELSE
  198.     lea    952(a0),a1        ; 1. Patternpos
  199.     lea    1084(a0),a2        ; 1. Patterndata
  200. pr_init4:
  201.     move.b    (a1)+,d2        ; x. Patternpos
  202.     moveq.l    #0,d3
  203.     move.b    d2,d3
  204.     mulu.w    #1024,d3
  205.     add.l    a2,d3
  206.     move.l    d3,(a3)+
  207.     dbf    d0,pr_init4
  208.     ENDC
  209.  
  210.     IFEQ    PACKEDSONGFORMAT-YES
  211.     move.l    4(a0),d2
  212.     add.l    a0,d2
  213.     ELSE
  214.     lea    952(a0),a1
  215.     moveq.l    #0,d1
  216.     moveq    #127,d0
  217. pr_init4_1:
  218.     move.b    (a1)+,d2
  219.     cmp.b    d1,d2            ; Highest Pattern ?
  220.     bls.s    pr_init4_2
  221.     move.b    d2,d1
  222. pr_init4_2:
  223.     dbf    d0,pr_init4_1
  224.     addq.w    #1,d1
  225.     move.l    a0,d2
  226.     mulu.w    #1024,d1        ; Highest Pattern * 1024 Bytes
  227.     add.l    #1084,d2
  228.     add.l    d1,d2
  229.     ENDC
  230.     lea    pr_Sampleinfos(pc),a3
  231.     lea    pr_Sampleinfos+SAMPLELENGTHOFFSET(pc),a2
  232.     moveq.l    #32,d7
  233.     move.l    d2,(a3)
  234.     moveq    #29,d0
  235. pr_init4_3:
  236.     move.l    (a3),d1
  237.     add.l    d7,a3
  238.     moveq.l    #0,d2
  239.     move.w    (a2),d2
  240.     add.l    d7,a2
  241.     add.l    d2,d2
  242.     add.l    d2,d1
  243.     move.l    d1,(a3)
  244.     dbf    d0,pr_init4_3
  245.  
  246.     lea    pr_Sampleinfos(pc),a2
  247.     lea    pr_Sampleinfos+SAMPLEREPEATPOINTOFFSET(pc),a3
  248.     moveq.l    #32,d7
  249.     moveq    #30,d0
  250. pr_init4_4:
  251.     move.l    (a2),d1
  252.     add.l    d1,(a3)
  253.     add.l    d7,a2
  254.     add.l    d7,a3
  255.     dbf    d0,pr_init4_4
  256.     
  257.     IFNE    PACKEDSONGFORMAT-YES
  258.     
  259.     cmp.l    #'SNT.',1080(a0)
  260.     beq.s    pr_init7
  261.     
  262.     lea    1084(a0),a1
  263.     move.l    pr_Sampleinfos(pc),a2
  264.     move.b    #$f0,d6
  265.     move.w    #$fff,d7
  266. pr_init5:
  267.     move.b    (a1),d0
  268.     move.b    2(a1),d1
  269.     move.w    (a1),d2
  270.     and.w    d7,2(a1)
  271.     and.w    d7,d2
  272.     
  273.     and.b    d6,d0
  274.     lsr.b    #4,d1
  275.     or.b    d1,d0
  276.     move.b    d0,(a1)
  277.     
  278.     tst.w    d2
  279.     beq.s    pr_init5_3
  280.     lea    pr_periods(pc),a4
  281.     moveq    #0,d1
  282. pr_init5_2:
  283.     addq.w    #1,d1
  284.     cmp.w    (a4)+,d2
  285.     bne.s    pr_init5_2
  286.     move.b    d1,1(a1)
  287. pr_init5_3:
  288.     cmp.b    #$d,2(a1)
  289.     bne.s    pr_init5_4
  290.  
  291.     moveq    #0,d1
  292.     move.b    3(a1),d1
  293.     moveq    #$f,d2
  294.     and.w    d1,d2
  295.     lsr.w    #4,d1
  296.     mulu.w    #10,d1
  297.     add.w    d2,d1
  298.     cmp.b    #63,d1
  299.     bls.s    pr_init5_3_2
  300.     moveq    #63,d1
  301. pr_init5_3_2:
  302.     move.b    d1,3(a1)
  303. pr_init5_4:
  304.     addq.l    #4,a1
  305.     cmp.l    a2,a1
  306.     blt.s    pr_init5    
  307.  
  308.     move.l    #'SNT.',1080(a0)
  309.  
  310.     ENDC
  311.     
  312. pr_init7:
  313.     lea    pr_Arpeggiofastlist(pc),a2
  314.     lea    pr_Arpeggiofastlistperiods(pc),a1
  315.     lea    35*2(a1),a1        ; to the end of list...
  316.     moveq    #0,d0
  317.     moveq    #35,d1
  318.     move.w    #999,d2
  319.     moveq    #0,d6
  320. pr_init8:
  321.     move.w    -(a1),d7
  322.     addq.w    #1,d6
  323. pr_init8_2:
  324.     cmp.w    d7,d0
  325.     blt.s    pr_init8_4
  326.     subq.w    #1,d1
  327.     tst.b    d1
  328.     bne.s    pr_init8
  329. pr_init8_3:
  330.     move.b    d1,(a2)+
  331.     dbf    d2,pr_init8_3
  332.     bra.s    pr_init8_5    
  333. pr_init8_4:
  334.     move.b    d1,(a2)+
  335.     addq.w    #1,d0
  336.     dbf    d2,pr_init8_2
  337. pr_init8_5:
  338.  
  339.     lea    pr_Channel0(pc),a1
  340.     move.w    #1,pr_Channel1-pr_Channel0(a1)
  341.     move.w    #1,pr_Channel2-pr_Channel0(a1)
  342.     move.w    #1,pr_Channel3-pr_Channel0(a1)
  343.     move.w    #1,(a1)+
  344.     moveq    #(pr_Channel1-pr_Channel0)/2-2,d0
  345. pr_init9_2:
  346.     clr.w    pr_Channel1-pr_Channel0(a1)
  347.     clr.w    pr_Channel2-pr_Channel0(a1)
  348.     clr.w    pr_Channel3-pr_Channel0(a1)
  349.     clr.w    (a1)+
  350.     dbf    d0,pr_init9_2
  351.  
  352.     lea    pr_fastperiodlist(pc),a1
  353.     lea    pr_periods(pc),a2
  354.     move.l    a2,(a1)
  355.     moveq.l    #36*2,d1
  356.     moveq    #14,d0
  357. pr_init9_3:
  358.     move.l    (a1)+,d2
  359.     add.l    d1,d2
  360.     move.l    d2,(a1)
  361.     dbf    d0,pr_init9_3
  362.         
  363.     lea    pr_Arpeggiofastdivisionlist(pc),a1
  364.     moveq    #0,d1
  365.     move.w    #$ff,d0
  366. pr_init9_4:
  367.     move.b    d1,(a1)+
  368.     subq.b    #1,d1
  369.     bpl.s    pr_init9_4_2
  370.     moveq    #2,d1
  371. pr_init9_4_2:
  372.     dbf    d0,pr_init9_4
  373.     
  374.     move.w    #6,pr_speed-pr_framecounter(a6)
  375.     move.w    pr_speed(pc),(a6)
  376.     clr.w    pr_Patternct-pr_framecounter(a6)
  377.     move.w    pr_highestpattern(pc),d0
  378.     move.w    pr_startposition(pc),d1
  379.     blt.s    pr_init9_5
  380.     cmp.w    d0,d1
  381.     bls.s    pr_init9_5_2
  382. pr_init9_5:
  383.     clr.w    pr_startposition-pr_framecounter(a6)
  384. pr_init9_5_2:
  385.     move.w    pr_startposition(pc),pr_currentpattern-pr_framecounter(a6)
  386.     
  387.     lea    pr_Patternpositions(pc),a3
  388.     move.l    a3,d0
  389.     moveq.l    #0,d1
  390.     move.w    pr_startposition(pc),d1
  391.     lsl.l    #2,d1
  392.     add.l    d1,d0
  393.     move.l    d0,pr_Patternpt-pr_framecounter(a6)
  394.     move.l    pr_Patternpt(pc),a5
  395.     move.l    (a5),pr_Currentposition-pr_framecounter(a6)
  396.     
  397.     lea    $dff000,a5
  398.     move.w    #$f,$96(a5)
  399.     move.w    #$8000,pr_dmacon-pr_framecounter(a6)
  400.     clr.w    $a8(a5)
  401.     clr.w    $b8(a5)
  402.     clr.w    $c8(a5)
  403.     clr.w    $d8(a5)
  404.     moveq    #0,d0
  405.     move.b    $bfe001,d0
  406.     move.w    d0,pr_oldledvalue-pr_framecounter(a6)
  407.     bset    #1,$bfe001
  408.     rts
  409.  
  410. * End-Routine *********************************************************
  411.  
  412. pr_end:
  413.     lea    $dff000,a5
  414.     move.w    #$f,$96(a5)
  415.     clr.w    $a8(a5)
  416.     clr.w    $b8(a5)
  417.     clr.w    $c8(a5)
  418.     clr.w    $d8(a5)
  419.     move.w    pr_oldledvalue(pc),d0
  420.     cmp.w    #$7fff,d0
  421.     beq.s    pr_end3
  422.     btst    #1,d0
  423.     beq.s    pr_end2
  424.     bset    #1,$bfe001
  425.     rts
  426. pr_end2:
  427.     bclr    #1,$bfe001
  428. pr_end3:
  429.     rts
  430.  
  431. * Music-Fading ********************************************************
  432.  
  433.     IFEQ    INCLUDEFADINGROUTINE-YES
  434. pr_fademusic:    macro
  435.     lea    pr_musicfadect(pc),a0
  436.     move.w    pr_musicfadedirection(pc),d0
  437.     add.w    d0,(a0)
  438.     cmp.w    #MAXVOLUME,(a0)
  439.     bls.s    pr_fademusicend
  440.     bgt.s    pr_fademusictoohigh
  441.     clr.w    (a0)
  442.     clr.w    pr_musicfadedirection-pr_musicfadect(a0)
  443.     rts
  444. pr_fademusictoohigh:
  445.     move.w    #MAXVOLUME,(a0)
  446.     clr.w    pr_musicfadedirection-pr_musicfadect(a0)
  447. pr_fademusicend:
  448.     endm
  449.  
  450. pr_musicfadect:        dc.w    MAXVOLUME
  451. pr_musicfadedirection:    dc.w    0
  452.     ENDC
  453.     
  454. * MACROS **************************************************************
  455.  
  456. pr_playchannel:    macro                ; do not change: d7,a2-a6
  457.         moveq    #0,d2
  458.         moveq    #0,d0
  459.         moveq    #0,d1
  460.         IFEQ    PACKEDSONGFORMAT-YES
  461.         move.b    (a6),d6
  462.         bpl.s    .pr_playchannel1
  463.         btst    #6,d6
  464.         bne.s    .pr_playchannel0
  465.         subq.l    #2,a6
  466.         clr.w    4(a4)
  467.         bra.s    .pr_playchannelend
  468. .pr_playchannel0:        
  469.         subq.l    #2,a6
  470.         move.b    56(a4),d0
  471.         move.b    57(a4),d1
  472.         move.b    58(a4),d2
  473.         move.w    58(a4),4(a4)
  474.         bra.s    .pr_playchanneljump        
  475. .pr_playchannel1:
  476.         moveq    #$f,d0
  477.         and.b    1(a6),d0
  478.         move.b    d0,4(a4)
  479.         move.b    d0,d2
  480.         move.b    2(a6),5(a4)
  481.         move.w    4(a4),58(a4)
  482.         
  483.         moveq    #1,d0
  484.         and.b    (a6),d0
  485.         move.b    1(a6),d1
  486.         lsr.b    #3,d1
  487.         bclr    #0,d1
  488.         or.b    d1,d0
  489.         move.b    d0,56(a4)        
  490.  
  491.         move.b    (a6),d1
  492.         lsr.b    #1,d1
  493.         move.b    d1,57(a4)
  494.         ELSE
  495.         move.w    2(a6),4(a4)
  496.         move.b    2(a6),d2
  497.         move.b    (a6),d0
  498.         move.b    1(a6),d1
  499.         ENDC
  500. .pr_playchanneljump:
  501.         add.w    d2,d2
  502.         lea    pr_playchannellist(pc),a0
  503.         move.w    (a0,d2.w),d2
  504.         jsr    (a0,d2.w)
  505. .pr_playchannelend:
  506.         IFEQ    PACKEDSONGFORMAT-YES
  507.         addq.l    #3,a6
  508.         ELSE
  509.         addq.l    #4,a6
  510.         ENDC
  511.         endm
  512.  
  513. pr_checkchannel:    macro            ; do not change: d7,a2-a6
  514.         bsr.w    pr_checkfunkrepeat
  515.         moveq    #0,d0
  516.         move.b    4(a4),d0
  517.         add.b    d0,d0
  518.         lea    pr_Effectchecklist(pc),a0
  519.         move.w    (a0,d0.w),d0
  520.         jsr    (a0,d0.w)
  521.         endm
  522.         
  523. pr_copyplayvalues:    macro
  524.         tst.w    pr_commandnotedelay-pr_framecounter(a2)
  525.         bne.s    .pr_copyplayvalues2
  526.         move.w    2(a4),6(a3)
  527. .pr_copyplayvalues2:
  528.         IFEQ    INCLUDEFADINGROUTINE-YES
  529.         move.w    12(a4),d0
  530.         mulu.w    pr_musicfadect-pr_framecounter(a2),d0
  531.          lsr.l    #FADINGSTEPS,d0
  532.         move.w    d0,8(a3)
  533.         ELSE
  534.         move.w    12(a4),8(a3)
  535.         ENDC
  536.         endm
  537.  
  538. * Music-Routine *******************************************************
  539.  
  540. pr_music:
  541.     IFEQ    INCLUDEFADINGROUTINE-YES
  542.     pr_fademusic
  543.     ENDC
  544.     lea    $dff000,a5
  545.  
  546.     lea    pr_framecounter(pc),a2
  547.     subq.w    #1,(a2)
  548.     beq.s    pr_music2
  549.     bra.w    pr_checkeffects
  550. pr_music2:
  551.     cmp.b    #1,pr_patterndelaytime-pr_framecounter+1(a2)
  552.     blt.s    pr_music2_2
  553.     bsr.w    pr_checkeffects
  554.     bra.w    pr_music2_9
  555. pr_music2_2:
  556.     move.l    pr_Currentposition(pc),a6
  557.     lea    pr_Channel0(pc),a4
  558.     lea    $a0(a5),a3
  559.     moveq    #1,d7
  560.     pr_playchannel
  561.     pr_copyplayvalues
  562. pr_music2_3:    
  563.     lea    pr_Channel1(pc),a4
  564.     lea    $b0(a5),a3
  565.     moveq    #2,d7
  566.     pr_playchannel
  567.     pr_copyplayvalues
  568. pr_music2_4:
  569.     lea    pr_Channel2(pc),a4
  570.     lea    $c0(a5),a3
  571.     moveq    #4,d7
  572.     pr_playchannel
  573.     pr_copyplayvalues
  574. pr_music2_5:
  575.     lea    pr_Channel3(pc),a4
  576.     lea    $d0(a5),a3
  577.     moveq    #8,d7
  578.     pr_playchannel
  579.     pr_copyplayvalues
  580.     
  581.     bsr    pr_sampledma
  582. pr_music2_9:
  583.     move.w    pr_speed(pc),(a2)
  584.     tst.w    pr_patternhasbeenbreaked-pr_framecounter(a2)
  585.     bne.s    pr_music3
  586.     tst.w    pr_patterndelaytime-pr_framecounter(a2)
  587.     beq.s    pr_music3_1
  588.     subq.w    #1,pr_patterndelaytime-pr_framecounter(a2)
  589.     beq.s    pr_music3_1
  590.     bra.s    pr_nonextpattern
  591. pr_music3:
  592.     clr.w    pr_patternhasbeenbreaked-pr_framecounter(a2)
  593.     tst.w    pr_patterndelaytime-pr_framecounter(a2)
  594.     beq.s    pr_music3_1
  595.     subq.w    #1,pr_patterndelaytime-pr_framecounter(a2)
  596. pr_music3_1:
  597.     lea    pr_Patternct(pc),a1
  598.     tst.w    pr_dontcalcnewposition-pr_framecounter(a2)
  599.     bne.s    pr_music3_2
  600.     move.l    a6,pr_Currentposition-pr_framecounter(a2)
  601.     addq.w    #1,(a1)
  602. pr_music3_2:
  603.     clr.w    pr_dontcalcnewposition-pr_framecounter(a2)
  604.     moveq.l    #64,d1
  605.     cmp.w    (a1),d1
  606.     bgt.s    pr_nonextpattern
  607.     sub.w    d1,(a1)
  608.     lea    pr_currentpattern(pc),a0
  609.     move.w    (a1),d1
  610.     beq.s    pr_music3_3
  611.     IFEQ    PACKEDSONGFORMAT-YES
  612.     move.l    pr_module(pc),a1
  613.     lea    386(a1),a1
  614.     move.w    (a0),d1
  615.     add.w    d1,d1
  616.     move.w    (a1,d1.w),d1
  617.     ELSE
  618.     lsl.w    #4,d1
  619.     ENDC
  620. pr_music3_3:
  621.     addq.l    #4,pr_Patternpt-pr_framecounter(a2)
  622.     addq.w    #1,(a0)
  623.     move.w    (a0),d0
  624.     cmp.w    pr_highestpattern-pr_framecounter(a2),d0
  625.     bls.s    pr_nohighestpattern
  626.     lea    pr_Patternpositions(pc),a1
  627.     move.l    a1,pr_Patternpt-pr_framecounter(a2)
  628.     clr.w    (a0)
  629. pr_nohighestpattern:
  630.     move.l    pr_Patternpt-pr_framecounter(a2),a6
  631.     move.l    (a6),d0
  632.     add.l    d1,d0
  633.     move.l    d0,pr_Currentposition-pr_framecounter(a2)
  634. pr_nonextpattern:
  635.     rts
  636.         
  637. pr_playchannellist:
  638.     dc.w    pr_playnormalchannel-pr_playchannellist        ; 0
  639.     dc.w    pr_playnormalchannel-pr_playchannellist        ; 1
  640.     dc.w    pr_playnormalchannel-pr_playchannellist        ; 2
  641.     dc.w    pr_playtpchannel-pr_playchannellist        ; 3
  642.     dc.w    pr_playnormalchannel-pr_playchannellist        ; 4
  643.     dc.w    pr_playtpchannel-pr_playchannellist        ; 5
  644.     dc.w    pr_playnormalchannel-pr_playchannellist        ; 6
  645.     dc.w    pr_playnormalchannel-pr_playchannellist        ; 7
  646.     dc.w    pr_playnormalchannel-pr_playchannellist        ; 8
  647.     dc.w    pr_playsochannel-pr_playchannellist        ; 9
  648.     dc.w    pr_playnormalchannel-pr_playchannellist        ; A
  649.     dc.w    pr_playnormalchannel-pr_playchannellist        ; B
  650.     dc.w    pr_playnormalchannel-pr_playchannellist        ; C
  651.     dc.w    pr_playnormalchannel-pr_playchannellist        ; D
  652.     dc.w    pr_playnormalchannel-pr_playchannellist        ; E
  653.     dc.w    pr_playnormalchannel-pr_playchannellist        ; F
  654.     
  655. * KANAL NORMAL SPIELEN ************************************************
  656.  
  657. pr_playnormalchannel:
  658.     lea    pr_Sampleinfos(pc),a0
  659.     lea    (a0),a1
  660.     lea    SAMPLEFINETUNEOFFSET(a1),a1
  661.     clr.w    pr_commandnotedelay-pr_framecounter(a2)
  662.     moveq    #-1,d4
  663.     lsl.w    #4,d4
  664.     and.w    4(a4),d4
  665.     cmp.w    #$ed0,d4
  666.     bne.s    pr_playnormalsamplenotedelay
  667.     addq.w    #1,pr_commandnotedelay-pr_framecounter(a2)
  668. pr_playnormalsamplenotedelay:
  669.     tst.b    d0
  670.     beq.w    pr_playnormalnonewsample    ; Irgendein Sample ?
  671.     move.w    d0,(a4)                ; Trage Samplenummer ein
  672.     tst.b    d1
  673.     bne.s    pr_playnormalsample
  674.     subq.b    #1,d0
  675.     lsl.l    #5,d0
  676.     add.l    d0,a0
  677.     addq.l    #6,a0
  678.     move.w    (a0)+,12(a4)
  679.     move.l    (a0)+,d2
  680.     move.l    d2,6(a4)
  681.     tst.w    (a0)+
  682.     beq.s    pr_playnormalchannel2
  683.     move.l    d2,36(a4)
  684.     move.l    d2,40(a4)
  685. pr_playnormalchannel2:
  686.     move.w    (a0)+,10(a4)
  687.     bra.w    pr_playnormalnonewperiod
  688. pr_playnormalsample:
  689.     or.w    d7,pr_dmacon-pr_framecounter(a2)
  690.     tst.w    pr_commandnotedelay-pr_framecounter(a2)
  691.     beq.w    pr_playnormalsamplenoedcom
  692.     subq.b    #1,d0
  693.     lsl.l    #5,d0
  694.     add.l    d0,a0
  695.     move.w    6(a0),12(a4)
  696.     move.l    8(a0),6(a4)
  697.     move.w    14(a0),10(a4)
  698.     bra.s    pr_playnormalnewperiod
  699. pr_playnormalsamplenoedcom:
  700.     move.w    d7,$96(a5)
  701.     subq.b    #1,d0
  702.     lsl.l    #5,d0
  703.     add.l    d0,a0
  704.     move.l    (a0)+,(a3)        ; Setze Samplestart
  705.     move.w    (a0)+,4(a3)        ; Setze Audiodatenlänge
  706.     move.w    (a0)+,12(a4)        ; Setze Samplelautstärke
  707.     move.l    (a0)+,d2
  708.     move.l    d2,6(a4)        ; Samplerepeatpoint eintragen
  709.     tst.w    (a0)+
  710.     beq.s    pr_playnormalsample2
  711.     move.l    d2,36(a4)
  712.     move.l    d2,40(a4)
  713. pr_playnormalsample2:
  714.     move.w    (a0)+,10(a4)        ; Samplerepeatlength eintragen
  715.     bra.s    pr_playnormalnewperiod
  716. pr_playnormalnonewsample:
  717.     clr.l    14(a4)
  718.     tst.b    d1
  719.     beq.s    pr_playnormalnonewperiod    ; Irgend ne neue Frequenz ?
  720.     move.w    (a4),d0            ; Alte Samplenummer holen
  721.     or.w    d7,pr_dmacon-pr_framecounter(a2)
  722.     tst.w    pr_commandnotedelay-pr_framecounter(a2)
  723.     bne.s    pr_playnormalnewperiod
  724.     move.w    d7,$96(a5)
  725. pr_playnormalnonewsamplenoedcom:
  726.     subq.b    #1,d0
  727.     lsl.l    #5,d0
  728.     add.l    d0,a0
  729.     move.l    (a0)+,(a3)        ; Setze Samplestart
  730.     move.w    (a0)+,4(a3)        ; Setze Audiodatenlänge
  731.     addq.l    #2,a0
  732.     move.l    (a0)+,d2
  733.     move.l    d2,6(a4)        ; Samplerepeatpoint eintragen
  734.     tst.w    (a0)+
  735.     beq.s    pr_playnormalnonewsample2
  736.     move.l    d2,36(a4)
  737.     move.l    d2,40(a4)
  738. pr_playnormalnonewsample2:
  739.     move.w    (a0)+,10(a4)        ; Samplerepeatlength eintragen
  740. pr_playnormalnewperiod:
  741.     subq.b    #1,d1
  742.     add.b    d1,d1
  743.     move.w    (a4),d0
  744.     subq.b    #1,d0
  745.     lsl.w    #5,d0
  746.     move.l    (a1,d0.w),a1
  747.     move.w    (a1,d1.w),2(a4)        ; Frequenz eintragen
  748. pr_playnormalnonewperiod:
  749.     bra.w    pr_playeffect
  750.  
  751. * KANAL MIT OFFSET SPIELEN *********************************************
  752.  
  753. pr_playsochannel:
  754.     lea    pr_Sampleinfos(pc),a0
  755.     lea    (a0),a1
  756.     lea    SAMPLEFINETUNEOFFSET(a1),a1
  757.     tst.b    d0
  758.     beq.w    pr_playsononewsample    ; Irgendein Sample ?
  759.     move.w    d0,(a4)                ; Trage Samplenummer ein
  760.     tst.b    d1
  761.     bne.s    pr_playsosample
  762.     subq.b    #1,d0
  763.     lsl.l    #5,d0
  764.     add.l    d0,a0
  765.     addq.l    #6,a0
  766.     move.w    (a0)+,12(a4)
  767.     move.l    (a0)+,d2
  768.     move.l    d2,6(a4)
  769.     tst.w    (a0)+
  770.     beq.s    pr_playsochannel2
  771.     move.l    d2,36(a4)
  772.     move.l    d2,40(a4)
  773. pr_playsochannel2:
  774.     move.w    (a0)+,10(a4)
  775.     bra.w    pr_playsononewperiod
  776. pr_playsosample:
  777.     move.w    d7,$96(a5)
  778.     or.w    d7,pr_dmacon-pr_framecounter(a2)
  779.     moveq.l    #0,d6
  780.     move.b    5(a4),d6
  781.     lsl.w    #7,d6
  782.     subq.b    #1,d0
  783.     lsl.l    #5,d0
  784.     add.l    d0,a0
  785.     move.l    (a0)+,d2
  786.     move.w    (a0)+,d3
  787.     cmp.w    d3,d6
  788.     bge.s    pr_playsosample2
  789.     sub.w    d6,d3
  790.     add.l    d6,d6
  791.     add.l    d6,d2
  792.     move.l    d2,(a3)            ; Setze Samplestart
  793.     move.w    d3,4(a3)        ; Setze Audiodatenlänge
  794.     move.w    (a0)+,12(a4)        ; Setze Samplelautstärke
  795.     move.l    (a0)+,d2
  796.     move.l    d2,6(a4)        ; Samplerepeatpoint eintragen
  797.     tst.w    (a0)+
  798.     beq.s    pr_playsosample1
  799.     move.l    d2,36(a4)
  800.     move.l    d2,40(a4)
  801. pr_playsosample1:
  802.     move.w    (a0)+,10(a4)        ; Samplerepeatlength eintragen
  803.     bra.w    pr_playsonewperiod
  804. pr_playsosample2:
  805.     move.w    (a0)+,12(a4)
  806.     move.l    (a0),(a3)
  807.     move.w    4(a0),4(a3)
  808.     move.l    (a0)+,d2
  809.     move.l    d2,6(a4)
  810.     tst.w    (a0)+
  811.     beq.s    pr_playsosample4
  812.     move.l    d2,36(a4)
  813.     move.l    d2,40(a4)
  814. pr_playsosample4:
  815.     move.w    (a0)+,10(a4)
  816.     bra.s    pr_playsonewperiod
  817. pr_playsononewsample:
  818.     clr.l    14(a4)
  819.     tst.b    d1
  820.     beq.b    pr_playsononewperiod    ; Irgend ne neue Frequenz ?
  821.     move.w    (a4),d0            ; Alte Samplenummer holen
  822.     move.w    d7,$96(a5)
  823.     or.w    d7,pr_dmacon-pr_framecounter(a2)
  824.     moveq.l    #0,d6
  825.     move.b    5(a4),d6
  826.     lsl.w    #7,d6
  827.     subq.b    #1,d0
  828.     lsl.l    #5,d0
  829.     add.l    d0,a0
  830.     move.l    (a0)+,d2
  831.     move.w    (a0)+,d3
  832.     cmp.w    d3,d6
  833.     bge.s    pr_playsosample3
  834.     sub.w    d6,d3
  835.     add.l    d6,d6
  836.     add.l    d6,d2
  837.     move.l    d2,(a3)            ; Setze Samplestart
  838.     move.w    d3,4(a3)        ; Setze Audiodatenlänge
  839.     addq.l    #2,a0
  840.     move.l    (a0)+,d2
  841.     move.l    d2,6(a4)        ; Samplerepeatpoint eintragen
  842.     tst.w    (a0)+
  843.     beq.s    pr_playsononewsample2
  844.     move.l    d2,36(a4)
  845.     move.l    d2,40(a4)
  846. pr_playsononewsample2:
  847.     move.w    (a0)+,10(a4)        ; Samplerepeatlength eintragen
  848.     bra.s    pr_playsonewperiod
  849. pr_playsosample3:
  850.     addq.l    #2,a0
  851.     move.l    (a0),(a3)
  852.     move.w    4(a0),4(a3)
  853.     move.l    (a0)+,d2
  854.     move.l    d2,6(a4)
  855.     tst.w    (a0)+
  856.     beq.s    pr_playsosample5
  857.     move.l    d2,36(a4)
  858.     move.l    d2,40(a4)
  859. pr_playsosample5:
  860.     move.w    (a0)+,10(a4)
  861.     bra.w    pr_playsonewperiod
  862. pr_playsonewperiod:
  863.     subq.w    #1,d1
  864.     add.b    d1,d1
  865.     move.w    (a4),d0
  866.     subq.b    #1,d0
  867.     lsl.w    #5,d0
  868.     move.l    (a1,d0.w),a1
  869.     move.w    (a1,d1.w),2(a4)        ; Frequenz eintragen
  870. pr_playsononewperiod:
  871.     bra.b    pr_playeffect
  872.  
  873. * Kanal spielen mit TONE PORTAMENTO **********************************
  874.  
  875. pr_playtpchannel:
  876.     lea    pr_Sampleinfos(pc),a0
  877.     lea    (a0),a1
  878.     lea    SAMPLEFINETUNEOFFSET(a1),a1
  879.     tst.b    d0
  880.     beq.s    pr_playtpnonewsample    ; Irgendein Sample ?
  881.     move.w    d0,(a4)            ; Trage Samplenummer ein
  882.     subq.b    #1,d0
  883.     lsl.l    #5,d0
  884.     add.l    d0,a0
  885.     addq.l    #6,a0
  886.     move.w    (a0)+,12(a4)        ; Lautstärke eintragen
  887.     move.l    (a0)+,d2
  888.     move.l    d2,6(a4)        ; Repeatpoint eintragen
  889.     tst.w    (a0)+
  890.     beq.s    pr_playtpchannel2
  891.     move.l    d2,36(a4)
  892.     move.l    d2,40(a4)
  893. pr_playtpchannel2:
  894.     move.w    (a0)+,10(a4)        ; Repeatlength eintragen
  895. pr_playtpnonewsample:
  896.     tst.b    d1
  897.     beq.s    pr_playtpnonewperiod    ; Irgend ne neue Frequenz ?
  898. pr_playtpnewperiod:
  899.     move.w    2(a4),14(a4)
  900.     subq.w    #1,d1
  901.     add.b    d1,d1
  902.     move.w    (a4),d0
  903.     subq.b    #1,d0
  904.     lsl.w    #5,d0
  905.     move.l    (a1,d0.w),a1
  906.     move.w    (a1,d1.w),d2
  907.     move.w    d2,16(a4)        ; Frequenz eintragen
  908.     bra.s    pr_playtpallowed
  909. pr_playtpnonewperiod:
  910.     tst.w    16(a4)
  911.     bne.s    pr_playtpallowed
  912.     clr.w    14(a4)
  913.     clr.l    26(a4)
  914. pr_playtpallowed:
  915.     bra.w    pr_playeffect
  916.  
  917. pr_playeffect:
  918.     bsr.w    pr_checkfunkrepeat
  919.     moveq    #0,d0
  920.     move.b    4(a4),d0
  921.     add.b    d0,d0
  922.     lea    pr_normaleffectlist(pc),a0
  923.     move.w    (a0,d0.w),d0
  924.     jmp    (a0,d0.w)
  925. pr_playnoeffect:
  926.     rts
  927.  
  928. pr_normaleffectlist:
  929.     dc.w    pr_playnoeffect-pr_normaleffectlist        ; 0
  930.     dc.w    pr_playnoeffect-pr_normaleffectlist        ; 1
  931.     dc.w    pr_playnoeffect-pr_normaleffectlist        ; 2
  932.     dc.w    pr_preptoneportamento-pr_normaleffectlist    ; 3
  933.     dc.w    pr_prepvibrato-pr_normaleffectlist        ; 4
  934.     dc.w    pr_playnoeffect-pr_normaleffectlist        ; 5
  935.     dc.w    pr_prepvibandvolslide-pr_normaleffectlist    ; 6
  936.     dc.w    pr_preptremolo-pr_normaleffectlist        ; 7
  937.     dc.w    pr_playnoeffect-pr_normaleffectlist        ; 8
  938.     dc.w    pr_playnoeffect-pr_normaleffectlist        ; 9
  939.     dc.w    pr_playnoeffect-pr_normaleffectlist        ; A
  940.     dc.w    pr_jumptopattern-pr_normaleffectlist        ; B
  941.     dc.w    pr_newvolume-pr_normaleffectlist        ; C
  942.     dc.w    pr_patternbreak-pr_normaleffectlist        ; D
  943.     dc.w    pr_play_e_command-pr_normaleffectlist        ; E
  944.     dc.w    pr_newspeed-pr_normaleffectlist            ; F
  945.  
  946. pr_play_e_command:
  947.     moveq    #0,d0
  948.     move.b    5(a4),d0
  949.     lsr.b    #3,d0
  950.     bclr    #0,d0
  951.     lea    pr_e_commandeffectlist(pc),a0
  952.     move.w    (a0,d0.w),d0
  953.     jmp    (a0,d0.w)
  954.     
  955. pr_e_commandeffectlist:
  956.     dc.w    pr_setfilter-pr_e_commandeffectlist        ; 0
  957.     dc.w    pr_fineslideup-pr_e_commandeffectlist        ; 1
  958.     dc.w    pr_fineslidedown-pr_e_commandeffectlist        ; 2
  959.     dc.w    pr_setglissandocontrol-pr_e_commandeffectlist    ; 3
  960.     dc.w    pr_setvibratowaveform-pr_e_commandeffectlist    ; 4
  961.     dc.w    pr_playfinetune-pr_e_commandeffectlist        ; 5
  962.     dc.w    pr_jumptoloop-pr_e_commandeffectlist        ; 6
  963.     dc.w    pr_settremolowaveform-pr_e_commandeffectlist    ; 7
  964.     dc.w    pr_playnoeffect-pr_e_commandeffectlist        ; 8
  965.     dc.w    pr_prepretrignote-pr_e_commandeffectlist    ; 9
  966.     dc.w    pr_finevolumeslideup-pr_e_commandeffectlist    ; A
  967.     dc.w    pr_finevolumeslidedown-pr_e_commandeffectlist    ; B
  968.     dc.w    pr_prepnotecut-pr_e_commandeffectlist        ; C
  969.     dc.w    pr_prepnotedelay-pr_e_commandeffectlist        ; D
  970.     dc.w    pr_preppatterndelay-pr_e_commandeffectlist    ; E
  971.     dc.w    pr_prepfunkrepeat-pr_e_commandeffectlist    ; F
  972.  
  973. pr_preppatterndelay:
  974.     cmp.b    #1,pr_patterndelaytime-pr_framecounter+1(a2)
  975.     bge.s    pr_preppatterndelayend
  976.     moveq    #$f,d0
  977.     and.b    5(a4),d0
  978.     addq.b    #1,d0
  979.     move.b    d0,pr_patterndelaytime-pr_framecounter+1(a2)
  980. pr_preppatterndelayend:
  981.     rts
  982.  
  983. pr_setvibratowaveform:
  984.     moveq    #$f,d0
  985.     and.b    5(a4),d0
  986.     move.w    d0,50(a4)
  987.     rts
  988.  
  989. pr_settremolowaveform:
  990.     moveq    #$f,d0
  991.     and.b    5(a4),d0
  992.     move.w    d0,52(a4)
  993.     rts
  994.  
  995. pr_setglissandocontrol:
  996.     moveq    #$f,d0
  997.     and.b    5(a4),d0
  998.     move.w    d0,48(a4)
  999.     rts
  1000.  
  1001. pr_playfinetune:
  1002.     moveq    #$f,d0
  1003.     and.b    5(a4),d0
  1004.     lsl.w    #2,d0
  1005.     lea    pr_fastperiodlist(pc),a0
  1006.     move.l    (a0,d0.w),a0
  1007.     moveq    #0,d1
  1008.     IFEQ    PACKEDSONGFORMAT-YES
  1009.     move.b    (a6),d1
  1010.     lsr.b    #1,d1
  1011.     ELSE
  1012.     move.b    1(a6),d1
  1013.     ENDC
  1014.     beq.s    pr_playfinetuneend
  1015.     subq.b    #1,d1
  1016.     add.w    d1,d1
  1017.     move.w    (a0,d1.w),2(a4)        ; Frequenz eintragen
  1018. pr_playfinetuneend:
  1019.     rts
  1020.     
  1021. pr_jumptoloop:
  1022.     moveq    #$f,d0
  1023.     and.b    5(a4),d0
  1024.     beq.s    pr_prepjumptoloop
  1025.     addq.b    #1,47(a4)
  1026.     cmp.b    47(a4),d0
  1027.     blt.s    pr_jumptoloopend
  1028.     moveq.l    #0,d0
  1029.     move.w    44(a4),d0
  1030.     move.w    d0,pr_Patternct-pr_framecounter(a2)
  1031.     move.l    pr_Patternpt(pc),a0
  1032.     move.l    (a0),d5
  1033.     IFEQ    PACKEDSONGFORMAT-YES
  1034.     moveq.l    #0,d0
  1035.     move.w    60(a4),d0
  1036.     ELSE
  1037.     lsl.l    #4,d0
  1038.     ENDIF
  1039.     add.l    d0,d5
  1040.     move.l    d5,pr_Currentposition-pr_framecounter(a2)
  1041.     addq.w    #1,pr_dontcalcnewposition-pr_framecounter(a2)
  1042.     rts
  1043. pr_jumptoloopend:
  1044.     clr.w    46(a4)
  1045.     rts
  1046. pr_prepjumptoloop:
  1047.     tst.w    46(a4)
  1048.     bne.s    pr_prepjumptoloopend
  1049.     move.w    pr_Patternct-pr_framecounter(a2),44(a4)
  1050.     IFEQ    PACKEDSONGFORMAT-YES
  1051.     move.l    pr_Currentposition(pc),d0
  1052.     move.l    pr_Patternpt(pc),a1
  1053.     sub.l    (a1),d0
  1054.     move.w    d0,60(a4)
  1055.     ENDC
  1056.     clr.w    46(a4)
  1057. pr_prepjumptoloopend:
  1058.     rts
  1059.  
  1060. pr_prepnotedelay:
  1061.     IFEQ    PACKEDSONGFORMAT-YES
  1062.     tst.b    57(a4)
  1063.     ELSE
  1064.     tst.b    1(a6)
  1065.     ENDC
  1066.     beq.s    pr_prepnotedelayend2
  1067.  
  1068.     moveq    #$f,d0
  1069.     and.b    5(a4),d0
  1070.     bne.s    pr_prepnotedelay2
  1071.     move.w    #$fff,18(a4)
  1072.     bra.w    pr_checknotedelay2
  1073. pr_prepnotedelay2:
  1074.     move.w    d7,d0
  1075.     not.b    d0
  1076.     and.b    d0,pr_dmacon-pr_framecounter+1(a2)
  1077.     clr.w    18(a4)
  1078.     rts
  1079. pr_prepnotedelayend2:
  1080.     move.w    #$fff,18(a4)
  1081.     rts
  1082.  
  1083. pr_prepretrignote:
  1084.     clr.w    18(a4)
  1085.     IFEQ    PACKEDSONGFORMAT-YES
  1086.     tst.b    56(a4)
  1087.     ELSE
  1088.     tst.w    (a6)
  1089.     ENDC
  1090.     bne.s    pr_prepretrignoteend
  1091.     bra.w    pr_checkretrignote2    
  1092. pr_prepretrignoteend:
  1093.     rts
  1094.  
  1095. pr_prepnotecut:
  1096.     clr.w    18(a4)
  1097.     moveq    #$f,d0
  1098.     and.b    5(a4),d0
  1099.     tst.b    d0
  1100.     bne.s    pr_prepnotecutend
  1101.     clr.w    12(a4)
  1102. pr_prepnotecutend:
  1103.     rts
  1104.     
  1105. pr_finevolumeslideup:
  1106.     moveq    #$f,d0
  1107.     and.b    5(a4),d0
  1108.     move.w    12(a4),d1
  1109.     add.w    d0,d1
  1110.     moveq    #64,d0
  1111.     cmp.w    d0,d1
  1112.     bls.s    pr_finevolumeslideup2
  1113.     move.w    d0,d1
  1114. pr_finevolumeslideup2:
  1115.     move.w    d1,12(a4)
  1116.     rts
  1117.  
  1118. pr_finevolumeslidedown:
  1119.     moveq    #$f,d0
  1120.     and.b    5(a4),d0
  1121.     move.w    12(a4),d1
  1122.     sub.w    d0,d1
  1123.     bpl.s    pr_finevolumeslidedown2
  1124.     moveq    #0,d1
  1125. pr_finevolumeslidedown2:
  1126.     move.w    d1,12(a4)
  1127.     rts
  1128.  
  1129. pr_fineslideup:
  1130.     moveq    #$f,d0
  1131.     and.b    5(a4),d0
  1132.     move.w    2(a4),d1
  1133.     sub.w    d0,d1
  1134.     cmp.w    #108,d1
  1135.     bge.s    pr_fineslideup2
  1136.     move.w    #108,d1
  1137. pr_fineslideup2:
  1138.     move.w    d1,2(a4)
  1139.     rts
  1140.  
  1141. pr_fineslidedown:
  1142.     moveq    #$f,d0
  1143.     and.b    5(a4),d0
  1144.     move.w    2(a4),d1
  1145.     add.w    d0,d1
  1146.     cmp.w    #907,d1
  1147.     bls.s    pr_fineslidedown2
  1148.     move.w    #907,d1
  1149. pr_fineslidedown2:
  1150.     move.w    d1,2(a4)
  1151.     rts
  1152.  
  1153. pr_setfilter:
  1154.     btst    #0,5(a4)
  1155.     beq.s    pr_setfilteron
  1156. pr_setfilteroff:
  1157.     bset    #1,$bfe001
  1158.     rts
  1159. pr_setfilteron:
  1160.     bclr    #1,$bfe001
  1161.     rts
  1162.  
  1163. pr_prepvibandvolslide:
  1164.     cmp.b    #1,pr_speed-pr_framecounter+1(a2)
  1165.     beq.s    pr_prepvibandvolslide2
  1166.     IFEQ    PACKEDSONGFORMAT-YES
  1167.     move.b    (a6),d1
  1168.     lsr.b    #1,d1
  1169.     ELSE
  1170.     tst.b    1(a6)
  1171.     ENDC
  1172.     beq.s    pr_prepvibandvolslide2
  1173.     clr.w    18(a4)
  1174. pr_prepvibandvolslide2:
  1175.     rts
  1176.  
  1177. pr_preptoneportamento:
  1178.     tst.b    5(a4)
  1179.     beq.s    pr_preptoneportamento2
  1180.     move.w    4(a4),22(a4)
  1181. pr_preptoneportamento2:
  1182.     rts
  1183.  
  1184. pr_prepvibrato:
  1185.     cmp.b    #1,pr_speed-pr_framecounter+1(a2)
  1186.     beq.s    pr_prepvibrato2
  1187.     IFEQ    PACKEDSONGFORMAT-YES
  1188.     move.b    (a6),d1
  1189.     lsr.b    #1,d1
  1190.     ELSE
  1191.     tst.b    1(a6)
  1192.     ENDC
  1193.     beq.s    pr_prepvibrato0
  1194.     clr.w    18(a4)
  1195. pr_prepvibrato0:
  1196.     move.b    5(a4),d0
  1197.     move.b    d0,d1
  1198.     lsr.b    #4,d1
  1199.     beq.s    pr_prepvibrato1
  1200.     move.b    d1,24(a4)
  1201. pr_prepvibrato1:
  1202.     and.b    #$f,d0
  1203.     beq.s    pr_prepvibrato2
  1204.     move.b    d0,25(a4)
  1205. pr_prepvibrato2:
  1206.     rts
  1207.  
  1208. pr_preptremolo:
  1209.     cmp.b    #1,pr_speed-pr_framecounter+1(a2)
  1210.     beq.s    pr_preptremolo2
  1211.     IFEQ    PACKEDSONGFORMAT-YES
  1212.     move.b    (a6),d1
  1213.     lsr.b    #1,d1
  1214.     ELSE
  1215.     tst.b    1(a6)
  1216.     ENDC
  1217.     beq.s    pr_preptremolo0
  1218.     clr.w    18(a4)
  1219. pr_preptremolo0:
  1220.     move.w    12(a4),20(a4)
  1221.     move.b    5(a4),d0
  1222.     move.b    d0,d1
  1223.     lsr.b    #4,d1
  1224.     beq.s    pr_preptremolo1
  1225.     move.b    d1,30(a4)
  1226. pr_preptremolo1:
  1227.     and.b    #$f,d0
  1228.     beq.s    pr_preptremolo2
  1229.     move.b    d0,31(a4)
  1230. pr_preptremolo2:
  1231.     rts
  1232.  
  1233. pr_newvolume:
  1234.     move.b    5(a4),d0
  1235.     cmp.b    #64,d0
  1236.     bls.s    pr_newvolumeend
  1237.     moveq    #64,d0
  1238. pr_newvolumeend:
  1239.     move.b    d0,13(a4)
  1240.     rts
  1241.  
  1242. pr_newspeed:
  1243.     move.b    5(a4),d0
  1244.     tst.b    d0
  1245.     bne.s    pr_newspeed2
  1246.     moveq    #1,d0
  1247. pr_newspeed2:
  1248.     move.b    d0,pr_speed-pr_framecounter+1(a2)
  1249.     rts
  1250.  
  1251. pr_patternbreak:
  1252.     moveq    #0,d0
  1253.     move.b    5(a4),d0
  1254.     add.w    #64,d0
  1255.     move.w    d0,pr_Patternct-pr_framecounter(a2)
  1256.     addq.w    #1,pr_patternhasbeenbreaked-pr_framecounter(a2)
  1257.     addq.w    #1,pr_dontcalcnewposition-pr_framecounter(a2)
  1258.     rts
  1259.         
  1260. pr_jumptopattern:
  1261.     moveq.l    #0,d0
  1262.     move.b    5(a4),d0
  1263.     subq.b    #1,d0
  1264.     bpl.s    pr_playjumptopattern2
  1265.     move.w    #128,d0
  1266. pr_playjumptopattern2:
  1267.     move.b    d0,pr_currentpattern-pr_framecounter+1(a2)
  1268.     lsl.l    #2,d0
  1269.     lea    pr_Patternpositions(pc),a0
  1270.     add.l    a0,d0
  1271.     move.l    d0,pr_Patternpt-pr_framecounter(a2)
  1272.     move.w    #64,pr_Patternct-pr_framecounter(a2)
  1273.     addq.w    #1,pr_patternhasbeenbreaked-pr_framecounter(a2)
  1274.     addq.w    #1,pr_dontcalcnewposition-pr_framecounter(a2)
  1275.     rts
  1276.  
  1277. * Control FX every frame **********************************************
  1278.  
  1279. pr_checkeffects:
  1280.     moveq    #1,d7
  1281.     lea    $a0(a5),a3
  1282.     lea    pr_Channel0(pc),a4
  1283.     move.w    12(a4),54(a4)
  1284.     pr_checkchannel
  1285.     IFEQ    INCLUDEFADINGROUTINE-YES
  1286.     move.w    54(a4),d0
  1287.     mulu.w    pr_musicfadect-pr_framecounter(a2),d0
  1288.     lsr.l    #FADINGSTEPS,d0
  1289.     move.w    d0,8(a3)
  1290.     ELSE
  1291.     move.w    54(a4),8(a3)
  1292.     ENDC
  1293.     
  1294.     moveq    #2,d7
  1295.     lea    $b0(a5),a3
  1296.     lea    pr_Channel1(pc),a4
  1297.     move.w    12(a4),54(a4)
  1298.     pr_checkchannel
  1299.     IFEQ    INCLUDEFADINGROUTINE-YES
  1300.     move.w    54(a4),d0
  1301.     mulu.w    pr_musicfadect-pr_framecounter(a2),d0
  1302.     lsr.l    #FADINGSTEPS,d0
  1303.     move.w    d0,8(a3)
  1304.     ELSE
  1305.     move.w    54(a4),8(a3)
  1306.     ENDC
  1307.  
  1308.     moveq    #4,d7
  1309.     lea    $c0(a5),a3
  1310.     lea    pr_Channel2(pc),a4
  1311.     move.w    12(a4),54(a4)
  1312.     pr_checkchannel
  1313.     IFEQ    INCLUDEFADINGROUTINE-YES
  1314.     move.w    54(a4),d0
  1315.     mulu.w    pr_musicfadect-pr_framecounter(a2),d0
  1316.     lsr.l    #FADINGSTEPS,d0
  1317.     move.w    d0,8(a3)
  1318.     ELSE
  1319.     move.w    54(a4),8(a3)
  1320.     ENDC
  1321.  
  1322.     moveq    #8,d7
  1323.     lea    $d0(a5),a3
  1324.     lea    pr_Channel3(pc),a4
  1325.     move.w    12(a4),54(a4)
  1326.     pr_checkchannel
  1327.     IFEQ    INCLUDEFADINGROUTINE-YES
  1328.     move.w    54(a4),d0
  1329.     mulu.w    pr_musicfadect-pr_framecounter(a2),d0
  1330.     lsr.l    #FADINGSTEPS,d0
  1331.     move.w    d0,8(a3)
  1332.     ELSE
  1333.     move.w    54(a4),8(a3)
  1334.     ENDC
  1335.  
  1336. pr_sampledma    bsr.w    pr_dmawait
  1337.         move.w    pr_dmacon(pc),d0
  1338.         or.w    #$8000,d0
  1339.         move.w    d0,$dff096
  1340.         bsr.w    pr_dmawait
  1341.  
  1342.         movem.l    a5-a6,-(sp)
  1343.         lea    $dff000,a5
  1344.         lea    pr_Channel0+6(pc),a6
  1345.         move.l    (a6),$a0(a5)
  1346.         move.w    4(a6),$a4(a5)
  1347.         move.l    pr_Channel1-pr_Channel0(a6),$b0(a5)
  1348.         move.w    4+pr_Channel1-pr_Channel0(a6),$b4(a5)
  1349.         move.l    pr_Channel2-pr_Channel0(a6),$c0(a5)
  1350.         move.w    4+pr_Channel2-pr_Channel0(a6),$c4(a5)
  1351.         move.l    pr_Channel3-pr_Channel0(a6),$d0(a5)
  1352.         move.w    4+pr_Channel3-pr_Channel0(a6),$d4(a5)
  1353.         movem.l    (sp)+,a5-a6
  1354.         rts
  1355.  
  1356. pr_dmawaiter    =3        ;rasters waits for dma... if no level6 use !!!
  1357.  
  1358. pr_dmawait    moveq    #pr_dmawaiter-1,d4
  1359. pr_waitdma2    move.b    $dff006,d5
  1360. pr_waitdma3    cmp.b    $dff006,d5
  1361.         dbeq    d4,pr_waitdma2        ;wait some rasters
  1362.         beq.b    pr_waitdma3
  1363.         rts
  1364.  
  1365. ***********************************************************************
  1366.  
  1367. pr_checknotchannel:
  1368.     rts
  1369.  
  1370. pr_check_e_commands
  1371.     moveq    #0,d0
  1372.     move.b    5(a4),d0
  1373.     lsr.b    #3,d0
  1374.     bclr    #0,d0
  1375.     lea    pr_E_Command_checklist(pc),a0
  1376.     move.w    (a0,d0.w),d0
  1377.     jmp    (a0,d0.w)
  1378.     
  1379. pr_Effectchecklist:
  1380.     dc.w    pr_checkarpeggio-pr_Effectchecklist        ; 0
  1381.     dc.w    pr_checkperiodslideup-pr_Effectchecklist    ; 1
  1382.     dc.w    pr_checkperiodslidedown-pr_Effectchecklist    ; 2
  1383.     dc.w    pr_checktoneportamento-pr_Effectchecklist    ; 3
  1384.     dc.w    pr_checkvibrato-pr_Effectchecklist        ; 4
  1385.     dc.w    pr_checktpandvolslide-pr_Effectchecklist    ; 5
  1386.     dc.w    pr_checkvibandvolslide-pr_Effectchecklist    ; 6
  1387.     dc.w    pr_checktremolo-pr_Effectchecklist        ; 7
  1388.     dc.w    pr_checknotchannel-pr_Effectchecklist        ; 8
  1389.     dc.w    pr_checknotchannel-pr_Effectchecklist        ; 9
  1390.     dc.w    pr_checkvolumeslide-pr_Effectchecklist        ; A
  1391.     dc.w    pr_checknotchannel-pr_Effectchecklist        ; B
  1392.     dc.w    pr_checknotchannel-pr_Effectchecklist        ; C
  1393.     dc.w    pr_checknotchannel-pr_Effectchecklist        ; D
  1394.     dc.w    pr_check_e_commands-pr_Effectchecklist        ; E
  1395.     dc.w    pr_checknotchannel-pr_Effectchecklist        ; F
  1396.  
  1397. pr_E_Command_checklist:
  1398.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; 0
  1399.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; 1
  1400.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; 2
  1401.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; 3
  1402.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; 4
  1403.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; 5
  1404.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; 6
  1405.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; 7
  1406.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; 8
  1407.     dc.w    pr_checkretrignote-pr_E_Command_checklist    ; 9
  1408.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; A
  1409.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; B
  1410.     dc.w    pr_checknotecut-pr_E_Command_checklist        ; C
  1411.     dc.w    pr_checknotedelay-pr_E_Command_checklist    ; D
  1412.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; E
  1413.     dc.w    pr_checknotchannel-pr_E_Command_checklist    ; F
  1414.  
  1415. pr_prepfunkrepeat:
  1416.     moveq    #$f,d0
  1417.     and.b    5(a4),d0
  1418.     move.b    d0,33(a4)
  1419.     tst.b    d0
  1420.     bne.s    pr_checkfunkrepeat
  1421.     rts
  1422. pr_checkfunkrepeat:
  1423.     move.w    32(a4),d0
  1424.     beq.s    pr_checkfunkrepeatend
  1425.     lea    pr_FunkTable(pc),a0
  1426.     move.b    (a0,d0.w),d0
  1427.     move.b    35(a4),d1
  1428.     add.b    d0,d1
  1429.     bmi.s    pr_checkfunkrepeat2
  1430.     move.b    d1,35(a4)
  1431.     rts
  1432. pr_checkfunkrepeat2:
  1433.     clr.b    35(a4)
  1434.  
  1435.     move.l    36(a4),d0
  1436.     beq.s    pr_checkfunkrepeatend
  1437.     move.l    d0,d2
  1438.     moveq.l    #0,d1
  1439.     move.w    10(a4),d1
  1440.     add.l    d1,d0
  1441.     add.l    d1,d0
  1442.     move.l    40(a4),a0
  1443.     addq.l    #1,a0
  1444.     cmp.l    d0,a0
  1445.     blo.s    pr_checkfunkrepeatok
  1446.     move.l    d2,a0
  1447. pr_checkfunkrepeatok:
  1448.     move.l    a0,40(a4)
  1449.     moveq    #-1,d0
  1450.     sub.b    (a0),d0
  1451.     move.b    d0,(a0)
  1452. pr_checkfunkrepeatend:
  1453.     rts
  1454.  
  1455. pr_checknotedelay:
  1456.     move.w    18(a4),d1
  1457.     addq.w    #1,d1
  1458.     cmp.w    d0,d1
  1459.     bne.s    pr_checknotedelayend
  1460. pr_checknotedelay2:
  1461.     move.w    d7,$96(a5)
  1462.     or.w    d7,pr_dmacon-pr_framecounter(a2)
  1463.     moveq.l    #0,d0
  1464.     move.w    (a4),d0
  1465.     subq.w    #1,d0
  1466.     lsl.w    #5,d0
  1467.     lea    pr_Sampleinfos(pc),a0
  1468.     add.l    d0,a0
  1469.     move.w    2(a4),6(a3)
  1470.     move.l    (a0)+,(a3)        ; Setze Samplestart
  1471.     move.w    (a0)+,4(a3)        ; Setze Audiodatenlänge
  1472.     addq.l    #2,a0
  1473.     move.l    (a0)+,d2
  1474.     move.l    d2,6(a4)        ; Samplerepeatpoint eintragen
  1475.     tst.w    (a0)+
  1476.     beq.s    pr_checknotedelay3
  1477.     move.l    d2,36(a4)
  1478.     move.l    d2,40(a4)
  1479. pr_checknotedelay3:
  1480.     move.w    (a0)+,10(a4)        ; Samplerepeatlength eintragen
  1481. pr_checknotedelayend:
  1482.     move.w    d1,18(a4)
  1483.     rts
  1484.  
  1485. pr_checkretrignote:
  1486.     moveq    #$f,d0
  1487.     and.b    5(a4),d0
  1488.     move.w    18(a4),d1
  1489.     addq.w    #1,d1
  1490.     cmp.w    d0,d1
  1491.     bne.s    pr_checkretrignoteend
  1492. pr_checkretrignote2:
  1493.     moveq    #0,d1
  1494.     move.w    d7,$96(a5)
  1495.     or.w    d7,pr_dmacon-pr_framecounter(a2)
  1496.     move.w    (a4),d0
  1497.     subq.w    #1,d0
  1498.     lsl.w    #5,d0
  1499.     lea    pr_Sampleinfos(pc),a0
  1500.     move.l    (a0,d0.w),(a3)
  1501.     move.w    4(a0,d0.w),4(a3)
  1502. pr_checkretrignoteend:
  1503.     move.w    d1,18(a4)
  1504.     rts
  1505.  
  1506. pr_checknotecut:
  1507.     moveq    #$f,d0
  1508.     and.b    5(a4),d0
  1509.     addq.w    #1,18(a4)
  1510.     move.w    18(a4),d1
  1511.     cmp.w    d0,d1
  1512.     blt.s    pr_checknotecutend
  1513.     clr.w    12(a4)
  1514.     clr.w    54(a4)
  1515. pr_checknotecutend:
  1516.     rts
  1517.  
  1518. pr_checkarpeggio:
  1519.     tst.b    5(a4)
  1520.     bne.s    pr_checkarpeggio0
  1521.     rts
  1522. pr_checkarpeggio0:
  1523.     move.w    (a2),d0
  1524.     lea    pr_Arpeggiofastdivisionlist(pc),a1
  1525.     move.b    (a1,d0.w),d0
  1526.     beq.s    pr_checkarpeggio2
  1527.     cmp.b    #2,d0
  1528.     beq.s    pr_checkarpeggio1
  1529.     moveq    #0,d0
  1530.     move.b    5(a4),d0
  1531.     lsr.b    #4,d0
  1532.     bra.s    pr_checkarpeggio3
  1533. pr_checkarpeggio2:
  1534.     move.w    2(a4),6(a3)
  1535.     rts
  1536. pr_checkarpeggio1:
  1537.     moveq    #$f,d0
  1538.     and.b    5(a4),d0
  1539. pr_checkarpeggio3:
  1540.     asl.w    #1,d0
  1541.     move.w    (a4),d1
  1542.     lsl.w    #5,d1
  1543.     lea    pr_Sampleinfos+SAMPLEFINETUNEOFFSET(pc),a0
  1544.     move.l    (a0,d1.w),a0
  1545.     move.w    2(a4),d1
  1546.     lea    pr_Arpeggiofastlist(pc),a1
  1547.     moveq.l    #0,d2
  1548.     move.b    (a1,d1.w),d2
  1549.     add.b    d2,d2
  1550.     add.l    d2,a0
  1551.     moveq    #36,d7
  1552. pr_checkarpeggioloop:
  1553.     cmp.w    (a0)+,d1
  1554.     bhs.s    pr_checkarpeggio4
  1555.     dbf    d7,pr_checkarpeggioloop
  1556.     rts
  1557. pr_checkarpeggio4:
  1558.     subq.l    #2,a0
  1559.     move.w    (a0,d0.w),6(a3)
  1560.     rts
  1561.  
  1562. pr_checktpandvolslide:
  1563.     bsr.w    pr_checkvolumeslide
  1564.     moveq    #0,d2
  1565.     move.b    23(a4),d2
  1566.     move.w    26(a4),d0
  1567.     move.w    28(a4),d1
  1568.     bsr.s    pr_checktoneportamento2
  1569.     move.w    14(a4),26(a4)
  1570.     rts
  1571.     
  1572. pr_checktoneportamento:
  1573.     moveq    #0,d2
  1574.     move.b    5(a4),d2
  1575.     bne.s    pr_checktoneportamento1
  1576.     move.b    23(a4),d2
  1577. pr_checktoneportamento1:
  1578.     move.w    14(a4),d0
  1579.     move.w    16(a4),d1
  1580. pr_checktoneportamento2:
  1581.     cmp.w    d0,d1
  1582.     bgt.s    pr_checktoneportamentoplus
  1583.     blt.s    pr_checktoneportamentominus
  1584.     cmp.w    #1,(a2)
  1585.     beq.s    pr_savetpvalues
  1586.     rts
  1587. pr_checktoneportamentoplus:
  1588.     add.w    d2,d0
  1589.     cmp.w    d0,d1
  1590.     bgt.s    pr_checktoneportamentoend
  1591.     move.w    d1,d0
  1592.     move.w    d1,14(a4)
  1593.     move.w    d1,2(a4)
  1594.     tst.w    48(a4)
  1595.     bne.s    pr_checktoneportamentoglissando
  1596.     move.w    d1,6(a3)
  1597.     cmp.w    #1,(a2)
  1598.     beq.s    pr_savetpvalues
  1599.     rts
  1600. pr_checktoneportamentominus:
  1601.     sub.w    d2,d0
  1602.     cmp.w    d0,d1
  1603.     blt.s    pr_checktoneportamentoend
  1604.     move.w    d1,d0
  1605.     move.w    d1,14(a4)
  1606.     move.w    d1,2(a4)
  1607.     tst.w    48(a4)
  1608.     bne.s    pr_checktoneportamentoglissando
  1609.     move.w    d1,6(a3)
  1610.     cmp.w    #1,(a2)
  1611.     beq.s    pr_savetpvalues
  1612.     rts
  1613. pr_checktoneportamentoend:
  1614.     move.w    d0,14(a4)
  1615.     move.w    d0,2(a4)
  1616.     tst.w    48(a4)
  1617.     bne.s    pr_checktoneportamentoglissando
  1618.     move.w    d0,6(a3)
  1619.     cmp.w    #1,(a2)
  1620.     beq.s    pr_savetpvalues
  1621.     rts    
  1622. pr_savetpvalues:
  1623.     move.l    14(a4),26(a4)
  1624.     rts
  1625. pr_checktoneportamentoglissando:
  1626.     move.w    (a4),d1
  1627.     lsl.w    #5,d1
  1628.     lea    pr_Sampleinfos+SAMPLEFINETUNEOFFSET(pc),a0
  1629.     move.l    (a0,d1.w),a0
  1630.     lea    pr_Arpeggiofastlist(pc),a1
  1631.     moveq.l    #0,d2
  1632.     move.b    (a1,d0.w),d2
  1633.     add.w    d2,d2
  1634.     add.l    d2,a0
  1635.     moveq    #0,d3
  1636.     moveq    #36*2,d1
  1637. pr_checktoneportamentoglissop:
  1638.     cmp.w    (a0,d3.w),d0
  1639.     bhs.s    pr_checktoneportamentoglissando2
  1640.     addq.w    #2,d3
  1641.     cmp.w    d1,d3
  1642.     blo.s    pr_checktoneportamentoglissop
  1643.     moveq    #35*2,d3
  1644. pr_checktoneportamentoglissando2:
  1645.     move.w    (a0,d3.w),6(a3)
  1646.     cmp.w    #1,(a2)
  1647.     beq.s    pr_savetpvalues
  1648.     rts
  1649.  
  1650. pr_checkvolumeslide:
  1651.     moveq    #0,d0
  1652.     move.b    5(a4),d0
  1653.     move.w    d0,d1
  1654.     lsr.b    #4,d1
  1655.     beq.s    pr_checkvolumeslidedown
  1656.     move.w    12(a4),d2
  1657.     add.w    d1,d2
  1658.     bmi.s    pr_checkvolumeslide0
  1659.     moveq    #64,d0
  1660.     cmp.w    d0,d2
  1661.     bgt.s    pr_checkvolumeslide64
  1662.     move.w    d2,12(a4)
  1663.     move.w    d2,54(a4)
  1664.     rts
  1665. pr_checkvolumeslidedown:    
  1666.     and.b    #$f,d0
  1667.     move.w    12(a4),d2
  1668.     sub.w    d0,d2
  1669.     bmi.s    pr_checkvolumeslide0
  1670.     moveq    #64,d0
  1671.     cmp.w    d0,d2
  1672.     bgt.s    pr_checkvolumeslide64
  1673.     move.w    d2,12(a4)
  1674.     move.w    d2,54(a4)
  1675.     rts
  1676. pr_checkvolumeslide64:
  1677.     move.w    d0,12(a4)
  1678.     move.w    d0,54(a4)
  1679.     rts
  1680. pr_checkvolumeslide0:
  1681.     clr.w    12(a4)
  1682.     clr.w    54(a4)
  1683.     rts
  1684.     
  1685. pr_checkperiodslidedown:
  1686.     moveq    #0,d0
  1687.     move.b    5(a4),d0
  1688.     add.w    d0,2(a4)
  1689.     cmp.w    #907,2(a4)
  1690.     bls.s    pr_checkperiodslidedown2
  1691.     move.w    #907,2(a4)
  1692. pr_checkperiodslidedown2:
  1693.     move.w    2(a4),6(a3)
  1694.     rts
  1695.  
  1696. pr_checkperiodslideup:
  1697.     moveq    #0,d0
  1698.     move.b    5(a4),d0
  1699.     sub.w    d0,2(a4)
  1700.     cmp.w    #108,2(a4)
  1701.     bge.s    pr_checkperiodslideup2
  1702.     move.w    #108,2(a4)
  1703. pr_checkperiodslideup2:
  1704.     move.w    2(a4),6(a3)
  1705.     rts
  1706.  
  1707. pr_checkvibandvolslide:
  1708.     bsr.w    pr_checkvolumeslide
  1709.     moveq.l    #0,d0
  1710.     moveq.l    #0,d1
  1711.     move.b    25(a4),d0
  1712.     move.b    24(a4),d1
  1713.     bra.s    pr_checkvibrato4
  1714.  
  1715. pr_checkvibrato:
  1716.     moveq.l    #0,d0
  1717.     moveq.l    #0,d1
  1718.     move.b    5(a4),d0    ; Tiefe
  1719. pr_checkvibrato2:
  1720.     move.w    d0,d1        ; Geschwindigkeit
  1721.     and.w    #$f,d0
  1722.     bne.s    pr_checkvibrato3
  1723.     move.b    25(a4),d0
  1724. pr_checkvibrato3:
  1725.     lsr.b    #4,d1
  1726.     bne.s    pr_checkvibrato4
  1727.     move.b    24(a4),d1
  1728. pr_checkvibrato4:
  1729.     move.w    18(a4),d2    ;Position
  1730.     lsr.w    #2,d2
  1731.     and.w    #$1f,d2
  1732.     move.w    50(a4),d3
  1733.     beq.s    pr_checkvibratosine
  1734.     btst    #0,d3
  1735.     bne.s    pr_checkvibratorampdown
  1736.     move.b    #255,d3
  1737.     bra.s    pr_checkvibratoset
  1738. pr_checkvibratorampdown:
  1739.     lsl.b    #3,d2
  1740.     tst.b    19(a4)
  1741.     bmi.s    pr_checkvibratorampdown2
  1742.     move.b    #255,d3
  1743.     sub.b    d2,d3
  1744.     bra.s    pr_checkvibratoset
  1745. pr_checkvibratorampdown2:
  1746.     move.b    d2,d3
  1747.     bra.s    pr_checkvibratoset
  1748. pr_checkvibratosine:
  1749.     lea    pr_VibratoTable(pc),a0
  1750.     moveq    #0,d3
  1751.     move.b    (a0,d2.w),d3
  1752. pr_checkvibratoset:
  1753.     mulu.w    d0,d3
  1754.     lsr.w    #7,d3
  1755.     move.w    2(a4),d2
  1756.     tst.b    19(a4)
  1757.     bpl.s    pr_checkvibratoneg
  1758.     add.w    d3,d2
  1759.     bra.s    pr_checkvibrato5
  1760. pr_checkvibratoneg:
  1761.     sub.w    d3,d2
  1762. pr_checkvibrato5:
  1763.     move.w    d2,6(a3)
  1764.     lsl.w    #2,d1
  1765.     add.b    d1,19(a4)
  1766.     rts
  1767.  
  1768. pr_checktremolo:
  1769.     moveq    #0,d0
  1770.     moveq.l    #0,d1
  1771.     move.b    5(a4),d0    ; Tiefe
  1772. pr_checktremolo2:
  1773.     move.w    d0,d1        ; Geschwindigkeit
  1774.     and.w    #$f,d0
  1775.     bne.s    pr_checktremolo3
  1776.     move.b    31(a4),d0
  1777. pr_checktremolo3:
  1778.     lsr.b    #4,d1
  1779.     bne.s    pr_checktremolo4
  1780.     move.b    30(a4),d1
  1781. pr_checktremolo4:
  1782.     move.w    18(a4),d2    ;Position
  1783.     lsr.w    #2,d2
  1784.     and.w    #$1f,d2
  1785.     move.w    52(a4),d3
  1786.     beq.s    pr_checktremolosine
  1787.     btst    #0,d3
  1788.     bne.s    pr_checktremolorampdown
  1789.     move.b    #255,d3
  1790.     bra.s    pr_checktremoloset
  1791. pr_checktremolorampdown:
  1792.     lsl.b    #3,d2
  1793.     tst.b    19(a4)
  1794.     bmi.s    pr_checktremolorampdown2
  1795.     move.b    #255,d3
  1796.     sub.b    d2,d3
  1797.     bra.s    pr_checktremoloset
  1798. pr_checktremolorampdown2:
  1799.     move.b    d2,d3
  1800.     bra.s    pr_checktremoloset
  1801. pr_checktremolosine:
  1802.     lea    pr_VibratoTable(pc),a0
  1803.     moveq    #0,d3
  1804.     move.b    (a0,d2.w),d3
  1805. pr_checktremoloset:
  1806.     mulu.w    d0,d3
  1807.     lsr.w    #6,d3
  1808.     move.w    20(a4),d2
  1809.     tst.b    19(a4)
  1810.     bpl.s    pr_checktremoloneg
  1811.     add.w    d3,d2
  1812.     moveq    #64,d4
  1813.     cmp.w    d4,d2
  1814.     bls.s    pr_checktremolo5
  1815.     move.w    d4,d2
  1816.     bra.s    pr_checktremolo5
  1817. pr_checktremoloneg:
  1818.     sub.w    d3,d2
  1819.     bpl.s    pr_checktremolo5
  1820.     moveq    #0,d2
  1821. pr_checktremolo5:
  1822.     move.w    d2,54(a4)
  1823.     lsl.w    #2,d1
  1824.     add.b    d1,19(a4)
  1825.     rts
  1826.  
  1827. pr_VibratoTable:    
  1828.     dc.b    0,24,49,74,97,120,141,161
  1829.     dc.b    180,197,212,224,235,244,250,253
  1830.     dc.b    255,253,250,244,235,224,212,197
  1831.     dc.b    180,161,141,120,97,74,49,24
  1832. pr_FunkTable:
  1833.     dc.b    0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  1834.     
  1835. * Variables ***********************************************************
  1836.  
  1837. pr_module:            dc.l    0
  1838. pr_startposition:        dc.w    0
  1839. pr_speed:            dc.w    6
  1840. pr_highestpattern:        dc.w    0
  1841. pr_currentpattern:        dc.w    0
  1842. pr_framecounter:        dc.w    0
  1843. pr_patterndelaytime:        dc.w    0
  1844. pr_patternhasbeenbreaked:    dc.w    0
  1845. pr_Patternpositions:        ds.l    128
  1846. pr_Patternpt:            dc.l    0
  1847. pr_Currentposition:        dc.l    0
  1848. pr_Patternct:            dc.w    0
  1849. pr_oldledvalue:            dc.w    0
  1850. pr_dontcalcnewposition:        dc.w    0
  1851. pr_commandnotedelay:        dc.w    0
  1852. pr_Channel0:            dc.w    1
  1853.                 ds.w    30
  1854. pr_Channel1:            dc.w    1
  1855.                 ds.w    30
  1856. pr_Channel2:            dc.w    1
  1857.                 ds.w    30
  1858. pr_Channel3:            dc.w    1
  1859.                 ds.w    30
  1860. pr_dmacon:            dc.w    $8000
  1861.  
  1862. pr_Arpeggiofastlist:        ds.b    1000
  1863. pr_Arpeggiofastdivisionlist:    ds.b    $100
  1864. pr_fastperiodlist:        ds.l    16
  1865. pr_Sampleinfos:            ds.b    32*32
  1866.  
  1867. pr_periods:
  1868. ; Tuning 0, Normal
  1869.     dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1870.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1871.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  1872. ; Tuning 1
  1873.     dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1874.     dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1875.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  1876. ; Tuning 2
  1877.     dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1878.     dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1879.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  1880. ; Tuning 3
  1881.     dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1882.     dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1883.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  1884. ; Tuning 4
  1885.     dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1886.     dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1887.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  1888. ; Tuning 5
  1889.     dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1890.     dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1891.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  1892. ; Tuning 6
  1893.     dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1894.     dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1895.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  1896. pr_Arpeggiofastlistperiods:
  1897. ; Tuning 7
  1898.     dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1899.     dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1900.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  1901. ; Tuning -8
  1902.     dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1903.     dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1904.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  1905. ; Tuning -7
  1906.     dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1907.     dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1908.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  1909. ; Tuning -6
  1910.     dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1911.     dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1912.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  1913. ; Tuning -5
  1914.     dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1915.     dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1916.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  1917. ; Tuning -4
  1918.     dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1919.     dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1920.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  1921. ; Tuning -3
  1922.     dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1923.     dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1924.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  1925. ; Tuning -2
  1926.     dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1927.     dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1928.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  1929. ; Tuning -1
  1930.     dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1931.     dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1932.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  1933.  
  1934.     
  1935. * END OF PRORUNNER ***************************************************
  1936.  
  1937.     SECTION    MUSIC,DATA_C
  1938. pr_data:
  1939.     incbin    "atro:music/mod.level1"
  1940.     END
  1941.